package com.xiejr.pss.gc;

/**
 * CMS垃圾回收器
 * <p>
 * CMS：并发标记清理
 * 会使用写屏障+增量更新方式完成GC回收
 *
 * @author mobai
 * @since 2021/8/3 23:10
 */
public class CMSGCTest {

    public static void main(String[] args) {
        //初始标记 STW 以a为GCRoots出发，扫描到B， 此时A标记为黑色
        A a = new A();
        //假设此处开始并发标记
        D d = a.b.d;
        //会出现多标，导致D对象在本轮GC不会回收
        a.b.d = null;
        //a因为在初始标记为黑色，会有可能出现漏标，导致D对象被回收掉而出现严重BUG
        a.d = d;
        //CMS使用写屏障的方式， 在黑色对象新增一条引用到白色对象之后，将黑色对象又重新标记为灰色，使得在重新标记阶段会继续扫描，避免漏标的情况

    }

    static class A {
        B b = new B();
        D d = null;
    }

    static class B {
        C c = new C();
        D d = new D();
    }

    static class C {
    }

    static class D {
    }
}
